iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0
Mobile Development

Android studio 30天初學筆記系列 第 24

[Android Studio 30天挑戰] Day24 -介紹MVC MVP

  • 分享至 

  • xImage
  •  

今天要來講的是MVP架構,架構是非常重要的,因為當你的程式越做越大時就會變得非常雜亂,這時只要有用架構好好分類,不管是對日後的維護或是有其他的人閱讀你的程式碼,都會比較淺顯易懂。而架構不只有MVP還有其他種類,下面就好好和你分享!!!!/images/emoticon/emoticon07.gif

架構種類和推薦

  1. M V C

M-負責處理與資料相關的事情。
V-負責處理與介面相關的事情。
C-介於View及Model之間的橋樑

  1. M V P

這裡的M和V和上面MVC是一樣的。
而Presenter則是擔任View及Model之間的橋樑,和負責邏輯處理的部分。

  1. M V V M

相對比較難講這邊先跳過。
推薦 MVVM > MVP > MVC
困難 MVVM > MVP > MVC

MVP的流程圖

下面是我彙整的一張流程圖,可以參考一下。
https://ithelp.ithome.com.tw/upload/images/20220731/20150369U995nPzcMJ.png

範例

這邊我設計了簡易的登入系統,在MainActivity先拿取登入資料,然後在Presenter做帳密判斷,如果帳密錯誤就叫View顯示Toast,如果帳密正確,到Modle拿取登入著資料,之後傳回給Presenter,最後再傳回給View顯示。
https://ithelp.ithome.com.tw/upload/images/20220731/20150369hdtHcMMHM9.png

MainActivity

//在後面加入implements
public class MainActivity extends AppCompatActivity implements Contract.view{
    //設定變數
    private EditText account;
    private EditText password;
    private Button  sent;
    private Context context=this;
    private Presenter presenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //綁定元件
        account=(EditText) findViewById(R.id.editTextTextPersonName);
        password=(EditText) findViewById(R.id.editTextTextPassword);
        sent=(Button) findViewById(R.id.button);
        //New出Presenter,並把自己丟入。
        presenter=new Presenter(this);
    }
    //當按下送出按鈕,拿取password和account給presente。
    public void sentOnClick(View view){
        presenter.getLoginData(account.getText().toString(),password.getText().toString());
    }
    //當presente判斷帳密輸入錯誤,呼叫此方法。
    @Override
    public void loginError() {
        Toast.makeText(context,"帳密錯誤",Toast.LENGTH_LONG).show();
    }
    //當presente判斷帳密輸入正確,呼叫此方法。
    @Override
    public void showUserName(String userName) {
        Toast.makeText(context,"歡迎登入"+userName,Toast.LENGTH_LONG).show();
    }
}

Presenter

public class Presenter implements Contract.presenter{
    //設定變數
    private Contract.view callBake;
    private String userName;
    private Modle modle;
    public Presenter(Contract.view view) {
        //接收View。
        this.callBake=view;
        //New出Modle,並把自己丟入。
        modle=new Modle(this);
    }
    @Override
    public void getLoginData(String password, String account) {
        //登入正確,
        if(password.equals("0000")&&account.equals("1111")) {
            //到Modle拿取登入人員資料。
            userName = modle.getUserName();
            //再傳回view,叫view更新畫面。
            callBake.showUserName(userName);
        }
        //登入錯誤。
        else
            callBake.loginError();
    }
}

Modle

public class Modle implements Contract.modle{
    private Contract.presenter callBake;
    public Modle(Contract.presenter presenter) {
        //接收presenter
        this.callBake=presenter;
    }
    //回傳登入人員資料
    @Override
    public String getUserName() {
        return "Chocolee";
    }
}

Contract

在 interface Contract 是用來讓Presenter,View,Modle互相溝通。
並在 interface Contract新增三個interface,並新增他們的方法。

public interface Contract {
    interface view{
        void loginError();
        void showUserName(String userName);
    }
    interface presenter{
        void getLoginData(String password,String account);
    }
    interface modle{
        String getUserName();
    }
}

登入錯誤

https://ithelp.ithome.com.tw/upload/images/20220801/20150369p89LvPv78n.png

登入成功

https://ithelp.ithome.com.tw/upload/images/20220801/20150369ohocCK25FS.png


上一篇
[Android Studio 30天挑戰] Day23 - 介紹ButterKnife
下一篇
[Android Studio 30天挑戰] Day25 -介紹Room
系列文
Android studio 30天初學筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言